.\"
.\" Copyright (c) 2010 AnyWi Technologies
.\" All rights reserved.
.\"
.\" Permission to use, copy, modify, and distribute this software for any
.\" purpose with or without fee is hereby granted, provided that the above
.\" copyright notice and this permission notice appear in all copies.
.\"
.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
.Dd August 19, 2017
.Dt USB_QUIRK 4
.Os
.Sh NAME
.Nm usb_quirk
.Nd USB quirks module
.Sh SYNOPSIS
To compile this module into the kernel,
place the following line in your
kernel configuration file:
.Bd -ragged -offset indent
.Cd "device usb"
.Ed
.Pp
Alternatively, to load the module at boot
time, place the following line in
.Xr loader.conf 5 :
.Bd -literal -offset indent
usb_quirk_load="YES"
.Ed
.Sh DESCRIPTION
The
.Nm
module provides support for dynamically adding and removing quirks for
USB devices with
.Xr usbconfig 8 .
.Sh General quirks:
.Bl -tag -width Ds
.It UQ_AUDIO_SWAP_LR
swap left and right channels
.It UQ_AU_INP_ASYNC
input is async despite claim of adaptive
.It UQ_AU_NO_FRAC
do not adjust for fractional samples
.It UQ_AU_NO_XU
audio device has broken extension unit
.It UQ_AU_VENDOR_CLASS
audio device uses vendor class to identify itself
.It UQ_AU_SET_SPDIF_CM6206
audio device needs special programming to enable S/PDIF audio output
.It UQ_BAD_ADC
bad audio spec version number
.It UQ_BAD_AUDIO
device claims audio class, but is not
.It UQ_BROKEN_BIDIR
printer has broken bidir mode
.It UQ_BUS_POWERED
device is bus powered, despite claim
.It UQ_HID_IGNORE
device should be ignored by hid class
.It UQ_KBD_IGNORE
device should be ignored by kbd class
.It UQ_KBD_BOOTPROTO
device should set the boot protocol
.It UQ_UMS_IGNORE
device should be ignored by ums class
.It UQ_MS_BAD_CLASS
does not identify properly
.It UQ_MS_LEADING_BYTE
mouse sends an unknown leading byte
.It UQ_MS_REVZ
mouse has Z-axis reversed
.It UQ_MS_VENDOR_BTN
mouse has buttons in vendor usage page
.It UQ_NO_STRINGS
string descriptors are broken
.It UQ_POWER_CLAIM
hub lies about power status
.It UQ_SPUR_BUT_UP
spurious mouse button up events
.It UQ_SWAP_UNICODE
has some Unicode strings swapped
.It UQ_CFG_INDEX_1
select configuration index 1 by default
.It UQ_CFG_INDEX_2
select configuration index 2 by default
.It UQ_CFG_INDEX_3
select configuration index 3 by default
.It UQ_CFG_INDEX_4
select configuration index 4 by default
.It UQ_CFG_INDEX_0
select configuration index 0 by default
.It UQ_ASSUME_CM_OVER_DATA
assume cm over data feature
.It UQ_IGNORE_CDC_CM
ignore cm descriptor
.It UQ_WMT_IGNORE
device should be ignored by wmt driver
.El
.Sh USB Mass Storage quirks:
.Bl -tag -width Ds
.It UQ_MSC_NO_TEST_UNIT_READY
send start/stop instead of TUR
.It UQ_MSC_NO_RS_CLEAR_UA
does not reset Unit Att.
.It UQ_MSC_NO_START_STOP
does not support start/stop
.It UQ_MSC_NO_GETMAXLUN
does not support get max LUN
.It UQ_MSC_NO_INQUIRY
fake generic inq response
.It UQ_MSC_NO_INQUIRY_EVPD
does not support inq EVPD
.It UQ_MSC_NO_SYNC_CACHE
does not support sync cache
.It UQ_MSC_SHUTTLE_INIT
requires Shuttle init sequence
.It UQ_MSC_ALT_IFACE_1
switch to alternate interface 1
.It UQ_MSC_FLOPPY_SPEED
does floppy speeds (20kb/s)
.It UQ_MSC_IGNORE_RESIDUE
gets residue wrong
.It UQ_MSC_WRONG_CSWSIG
uses wrong CSW signature
.It UQ_MSC_RBC_PAD_TO_12
pad RBC requests to 12 bytes
.It UQ_MSC_READ_CAP_OFFBY1
reports sector count, not max sec.
.It UQ_MSC_FORCE_SHORT_INQ
does not support full inq.
.It UQ_MSC_FORCE_WIRE_BBB
force BBB wire protocol
.It UQ_MSC_FORCE_WIRE_CBI
force CBI wire protocol
.It UQ_MSC_FORCE_WIRE_CBI_I
force CBI with int. wire protocol
.It UQ_MSC_FORCE_PROTO_SCSI
force SCSI command protocol
.It UQ_MSC_FORCE_PROTO_ATAPI
force ATAPI command protocol
.It UQ_MSC_FORCE_PROTO_UFI
force UFI command protocol
.It UQ_MSC_FORCE_PROTO_RBC
force RBC command protocol
.El
.Sh 3G Datacard (u3g) quirks:
.Bl -tag -width Ds
.It UQ_MSC_EJECT_HUAWEI
ejects after Huawei USB command
.It UQ_MSC_EJECT_SIERRA
ejects after Sierra USB command
.It UQ_MSC_EJECT_SCSIEJECT
ejects after SCSI eject command
.Dv 0x1b0000000200
.It UQ_MSC_EJECT_REZERO
ejects after SCSI rezero command
.Dv 0x010000000000
.It UQ_MSC_EJECT_ZTESTOR
ejects after ZTE SCSI command
.Dv 0x850101011801010101010000
.It UQ_MSC_EJECT_CMOTECH
ejects after C-motech SCSI command
.Dv 0xff52444556434847
.It UQ_MSC_EJECT_WAIT
wait for the device to eject
.It UQ_MSC_EJECT_SAEL_M460
ejects after Sael USB commands
.It UQ_MSC_EJECT_HUAWEISCSI
ejects after Huawei SCSI command
.Dv 0x11060000000000000000000000000000
.It UQ_MSC_EJECT_TCT
ejects after TCT SCSI command
.Dv 0x06f504025270
.It UQ_MSC_DYMO_EJECT
ejects after HID command
.Dv 0x1b5a01
.El
.Pp
See
.Pa /sys/dev/usb/quirk/usb_quirk.h
or run "usbconfig dump_quirk_names" for the complete list of supported quirks.
.Sh LOADER TUNABLE
The following tunable can be set at the
.Xr loader 8
prompt before booting the kernel, or stored in
.Xr loader.conf 5 .
.Bl -tag -width indent
.It Va hw.usb.quirk.%d
The value is a string whose format is:
.Bd -literal -offset indent
.Qo VendorId ProductId LowRevision HighRevision UQ_QUIRK,... Qc
.Ed
.Pp
Installs the quirks
.Ic UQ_QUIRK,...
for all USB devices matching
.Ic VendorId
and
.Ic ProductId
which have a hardware revision between and including
.Ic LowRevision
and
.Ic HighRevision .
.Pp
.Ic VendorId ,
.Ic ProductId ,
.Ic LowRevision
and
.Ic HighRevision
are all 16 bits numbers which can be decimal or hexadecimal based.
.Pp
A maximum of 100 variables
.Ic hw.usb.quirk.0, .1, ..., .99
can be defined.
.Pp
If a matching entry is found in the kernel's internal quirks table, it
is replaced by the new definition.
.Pp
Else a new entry is created given that the quirk table is not full.
.Pp
The kernel iterates over the
.Ic hw.usb.quirk.N
variables starting at
.Ic N = 0
and stops at
.Ic N = 99
or the first non-existing one.
.El
.Sh EXAMPLES
After attaching a
.Nm u3g
device which appears as a USB device on
.Pa ugen0.3 :
.Bd -literal -offset indent
usbconfig -d ugen0.3 add_quirk UQ_MSC_EJECT_WAIT
.Ed
.Pp
Enable a Holtec/Keep Out F85 gaming keyboard on
.Pa ugen1.4 :
.Bd -literal -offset indent
usbconfig -d ugen1.4 add_quirk UQ_KBD_BOOTPROTO
.Ed
.Pp
To install a quirk at boot time, place one or several lines like the
following in
.Xr loader.conf 5 :
.Bd -literal -offset indent
hw.usb.quirk.0="0x04d9 0xfa50 0 0xffff UQ_KBD_IGNORE"
.Ed
.Sh SEE ALSO
.Xr usbconfig 8
.Sh HISTORY
The
.Nm
module appeared in
.Fx 8.0 ,
and was written by
.An Hans Petter Selasky Aq Mt hselasky@FreeBSD.org .
This manual page was written by
.An Nick Hibma Aq Mt n_hibma@FreeBSD.org .
